#ifndef __LISTENSERIALIZE_HEADER
#define __LISTENSERIALIZE_HEADER

#include <string>

// 监听进程中的序列化函数
// 根据socket中接收到的请求报文
// 序列化为字符串发送到管道
struct ListenSerialize {
	static const int MAX_BUFF_SIZE = 10100;
	static const int HEADER_SIZE = 64;
	static const int FIELD_SIZE  = 16;

	char *buff;

	ListenSerialize() {
		buff = new char[MAX_BUFF_SIZE];
	}
	~ListenSerialize() {
		delete[] buff;
	}

	std::string operator() (int fd, const char *header, const char *body) {
		int index;
		int cnt = HEADER_SIZE / FIELD_SIZE;
		
		// 序列化后的第一个字段是socket_fd
		memset(buff, 0, sizeof(char)*MAX_BUFF_SIZE);
		sprintf(buff, "%d|", fd);
		index = strlen(buff);

		// 将header里面的字段取出来，除开源代码长度这个字段
		for (int i = 0; i < cnt; i++) {
			if (i == cnt-1) continue; // 源代码长度字段
			for (int j = 0; j < FIELD_SIZE && header[i*FIELD_SIZE+j]; j++, index++) {
				buff[index] = header[i*FIELD_SIZE+j];
			}
			buff[index++] = '|';
		}
		
		// body，也就是源代码
		for (int i = 0; body[i]; i++, index++) 
			buff[index] = body[i];
		buff[index]   = '\0';
		
		// tot length
		char str[10];
		sprintf(str, "%d|", strlen(buff));
		return std::string(str) + std::string(buff);
	}
};

#endif // __LISTENSERIALIZE_HEADER
